package com.example.image

import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import java.io.ByteArrayOutputStream

/**
 * Bitmap压缩工具
 * 压缩方式:大小，质量，缩放，格式，矩阵，采样等
 */
object BitmapUtil {

    /**
     * 质量压缩
     */
    fun compressQuality(resource: Resources, resId:Int, quality:Int):Bitmap{
        //从资源文件中解析图片
        var bm=BitmapFactory.decodeResource(resource,resId)
        var bmos=ByteArrayOutputStream()
        //把图片压缩到输出流中
        bm.compress(Bitmap.CompressFormat.JPEG,100,bmos)
        //从流中解析图片
        var newBitmap=BitmapFactory.decodeByteArray(bmos.toByteArray(),quality,bmos.toByteArray().size)
        //回收资源
        bm.recycle()
        bmos.close()
        return newBitmap
    }

    /**
     * 矩阵压缩
     */
    fun compressMatrixBitmap(resource: Resources, resId:Int,sx:Float,sy:Float):Bitmap{
        //创建矩阵Matrix
        var bitmapMatrix =Matrix().apply {
            setScale(sx, sy)
        }

        //加载资源图片
        val bm = BitmapFactory.decodeResource(resource, resId)
        //创建新的Bitmap
        var newBitmap =Bitmap.createBitmap(bm,0,0,bm.width,bm.height,bitmapMatrix,true)
        //释放资源
        bm.recycle()

        return newBitmap
    }

    /**
     *  编码格式压缩
     *  计算图片占内存大小：宽*高*每像素所占字节数
     *  ARGB_8888 占4字节 32位(不推荐)
     *  RGB_565 占2字节 16位（通用）
     *  ALPHA_8 占1字节 8位
     *  RGBA_F16 占8字节 64位（不推荐）
     *  ARGB_4444 占2字节 16位（即将废弃）
     *
     *
     * */

    fun compressEncodeFormatBitmap(resource: Resources, resId:Int,config:Bitmap.Config=Bitmap.Config.RGB_565):Bitmap{
        var options=BitmapFactory.Options().apply {
            inPreferredConfig=config
        }

        var newBitmap=BitmapFactory.decodeResource(resource,resId,options)

        return newBitmap
    }

    fun compressScaleBitmap(resource: Resources,resId: Int,dstW:Int,dstH:Int):Bitmap{
        var bm=BitmapFactory.decodeResource(resource,resId)
        bm.recycle()
        return Bitmap.createScaledBitmap(bm,dstW,dstH,true)

    }

    fun compressSampleSizeBitmap(resource: Resources,resId: Int,maxWidth:Int,maxHeight:Int):Bitmap{

        var sampleSize=1

        //创建加载参数
        var options=BitmapFactory.Options().apply {
            inJustDecodeBounds=true  //表示只加载图片的宽高，不加载图片像素点
        }

        //第一次加载获取图片宽高
        var bm= BitmapFactory.decodeResource(resource,resId,options)

        //获取图片宽高
        var bmW=options.outWidth
        var bmH=options.outHeight

        while (bmW>maxWidth|| bmH>maxHeight){
            sampleSize*=2 //采样率大小增加2倍
            //重新计算宽和高
            bmW/=sampleSize
            bmH/=sampleSize
        }

        //加载图片的像素
        options.inJustDecodeBounds=false
        options.inSampleSize=sampleSize

        bm.recycle()

        return BitmapFactory.decodeResource(resource,resId,options)


    }

}